#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <modbus.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
}vt;

struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
}st;

int main(int argc, char const *argv[])
{
    int shmid;

    //创建key值
    ///tmp/ipc/shmem/shm
    int key = ftok("./thttpd-master/custom_handle.c", 'j');
    if (key < 0)
    {
        perror("ftok err");
        return -1;
    }
    printf("key: %#x\n", key);

    //创建或打开共享内存
    shmid = shmget(key, 1024, IPC_CREAT | 0666); //没有则创建共享内存，已有则返回-1
    printf("%d\n",shmid);
    if (shmid <= 0)
    {
        if (errno == EEXIST)                //如果已存在则直接打开共享内存
            shmid = shmget(key, 1024, 0666); //直接打开共享内存，返回共享内存id
        else
        {
            perror("shmget err");
            return -1;
        }
    }
    printf("shmid: %d\n", shmid);

    //映射共享内存到用户空间
    int *num = (int *)shmat(shmid, NULL, 0);
    if (num == (int *)-1)
    {
        perror("shmat err");
        return -1;
    }
    *num=11;
    struct std_node *st;
    st = (struct std_node *)(num+1);
    for(int i = 0; i < 11; i++)
    {
        st->new_val.f_val =  20.55;
        printf("%f\n",st->new_val.f_val);
        st ++;
    }
    while (1)
    {
        
    }
    
    return 0;
}
